package com.zmm.util.generate.number;

import com.zmm.common.enums.DatePatternEnums;
import com.zmm.util.time.DateUtil;
import com.zmm.util.time.ThreadDateUtil;

import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import java.util.UUID;

/**
 * @author 900045
 * @description:
 * @name CodeUtils
 * @date By 2021-06-22 11:29:21
 */
public final class CodeUtils {

	private static Random RANDOM;

	/**
	 *  标记格式化
	 */
	public static final DecimalFormat SIGN_FORMAT = new DecimalFormat("000000");
	/**
	 * 格式化活动编码
	 */
	public static final DecimalFormat ACT_FORMAT = new DecimalFormat("0000");
	/**
	 * 格式化期数编码
	 */
	public static final DecimalFormat PHA_FORMAT = new DecimalFormat("00");

	/**
	 *  标记格式化格式化字符串
	 */
	private static final String FORMAT_STRING = "888888";

	/**
	 *  标记格式化格式化字符串 前缀
	 */
	private static final String FORMAT_STRING_PREFIX = "0";

	/**
	 *  标记长度
	 */
	public static final Integer SIGN_LENGTH = 6;

	/**
	 *  账户相关编号 长度
	 */
	public static final Integer SIGN_LENGTH_FOR_ACCOUNT = 9;

	/**
	 *  CMB支付标记长度
	 */
	public static final Integer SIGN_LENGTH_PAY_CMB = 4;

	/**
	 *  余额支付标记长度
	 */
	public static final Integer SIGN_LENGTH_PAY_CMI = 4;

	/**
	 *  活动订单开头标记
	 */
	public static final String PREFIX_ACT = "A";

	/**
	 *  用户密码随机数长度
	 */
	public static final Integer USER_PASSWORD = 6;
	
	private CodeUtils() {

	}
	/**
	 * 获取 账号编号 
	 *
	 * @param userId
	 * @return
	 */
	public static String getAccountCode(long userId) {
		return formatSign(userId) + generateRandomInt(SIGN_LENGTH_FOR_ACCOUNT);
	}

	/**
	 * 获取充值编号 
	 *
	 * @param accountId
	 * @return
	 */
	public static String getRechargeCode(long accountId) {
		return formatSign(accountId) + generateRandomInt(SIGN_LENGTH_FOR_ACCOUNT);
	}

	/**
	 * 是否是活动订单
	 *
	 * @param orderSn
	 * @return
	 */
	public static boolean isActOrder(String orderSn) {
		return orderSn != null && orderSn.startsWith(PREFIX_ACT);
	}

	/**
	 * 格式化标记
	 *
	 * @return4
	 */
	public static String formatSign(long param) {
		String str = Long.toString(param);
		int length = str.length() - SIGN_LENGTH;
		if (length == 0) {
			return str;
		} else if (length < 0) {
			str = FORMAT_STRING_PREFIX + str;
			return FORMAT_STRING.substring(0, Math.abs(length) - 1) + str;
		} else {
			return str.substring(length, str.length());
		}
	}

	/**
	 * 方法名: getPalletSn
	 * 方法描述: 生成托盘编号
	 * 修改时间：2017年6月28日 上午11:34:24 
	 * 参数 @return 参数说明
	 * 返回类型 String 返回类型
	 */
	public static String getPalletSn() {
		Random ne = new Random();
		int x = ne.nextInt(9999 - 1000 + 1) + 1000;
		return DateUtil.getNowMonthDay() + x;
	}

	/**
	 * 入库单编号生成
	 *
	 * @return
	 */
	public static String stockInCode() {

		return "IN" + stockCode();
	}

	/**
	 * 出库单编号生成
	 *
	 * @return
	 */
	public static String stockOutCode() {

		return "OUT" + stockCode();
	}

	/**
	 * 方法名: applyCashOddNum
	 * 方法描述: 提现订单号生成
	 * 修改时间：2017年5月31日 下午3:24:52 
	 * 参数 @return 参数说明
	 * 返回类型 String 返回类型
	 */
	public static String applyCashOddNum() {
		return getCodeByUUId();
	}

	/**
	 *  出入库单编号生成辅助方法
	 *
	 * @return
	 */
	private static String stockCode() {
		return ThreadDateUtil.getDateFormat(DatePatternEnums.YYYYMMDDHHMMSS.pattern).format(new Date()) + generateRandomInt(5);
	}

	/**
	 * 方法名: getOrderIdByUUId
	 * 方法描述: 获取
	 * 修改时间：2017年6月1日 下午4:57:15 
	 * 参数 @return 参数说明
	 * 返回类型 String 返回类型
	 */
	public static String getCodeByUUId() {
		String date = ThreadDateUtil.getDateFormat(DatePatternEnums.YYYYMMDDHHMMSS.pattern).format(new Date());
		date = date.substring(2, 8);
		int hashCodeV = UUID.randomUUID().toString().hashCode();
		//有可能是负数
		if (hashCodeV < 0) {
			hashCodeV = -hashCodeV;
		}
		long nowTime = System.nanoTime();
		String time = String.valueOf(nowTime);
		time = time.substring(7, 9);
		// 0 代表前面补充0     
		// 4 代表长度为4     
		// d 代表参数为正数型
		String str = String.format("%015d", hashCodeV);
		str = str.substring(5, str.length());
		return date + str + time;
	}

	/**
	 * 获取指定长度(1位到9位)的随机数字字符串
	 *
	 * @param length  大于1  小于9
	 * @return
	 */
	public static String generateRandomInt(int length) {
		length = length < 1 ? 1 : length;
		length = length > 9 ? 9 : length;
		int max = ((int) Math.pow(10, length)) - 1;
		int min = (int) Math.pow(10, length - 1);
		return String.valueOf((int) (Math.random() * (max - min) + min));
	}

	public static String getGuid(){
		//获取时间戳
		long now = System.currentTimeMillis();
		return getYear()+now;
	}

	/**
	 * 获取4位的年份
	 * @return
	 */
	public static String getYear(){
		//获取时间戳
		long now = System.currentTimeMillis();
		SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy");
		//获取4位年份数字
		String time=dateFormat.format(now);
		return time;
	}

	/**
	 * 获取指的随机数字
	 *
	 * @param length 最大范围
	 * @return
	 */
	public static int generateRandom(int length) {
		if (RANDOM == null) {
			RANDOM = new Random();
		}
		return RANDOM.nextInt(length);
	}

	/**
	 * 获取一个 值的长度
	 * @param number
	 * @return
	 */
	public static int getNumberLength(int number){
		int numberOfDigits = String.valueOf(number).length();
		return numberOfDigits;
	}


}
